package com.flyqiu.flow.event.api;

import com.alibaba.fastjson2.JSONObject;
import com.flyqiu.flow.event.base.ProcEvent;

public interface FlyQiuFlowEventManage {


    <T extends ProcEvent<?>> void addEvent(Class<T> clazz, T eventInst);

    /**
     * 移除该类型全部事件
     *
     * @param clazz
     * @param <T>
     */
    <T extends ProcEvent<?>> void removeEvent(Class<T> clazz);

    /**
     * 移除事件 对象
     *
     * @param <T>
     * @param eventInst
     */
    <T extends ProcEvent<?>> void removeEvent(T eventInst);


    <T, I> void triggerCreateBeforeEvent(Class<T> clazz, I inst);


    <T, I> void triggerCreateAfterEvent(Class<T> clazz, I inst);

    /**
     * 完成前
     *
     * @param clazz
     * @param inst
     * @param <T>
     * @param <I>
     */
    <T, I> void triggerCompleteBeforeEvent(Class<T> clazz, I inst);

    /**
     * 完成后
     *
     * @param clazz
     * @param inst
     * @param <T>
     * @param <I>
     */
    <T, I> void triggerCompleteAfterEvent(Class<T> clazz, I inst);

    /**
     * 删除前
     *
     * @param clazz  类型
     * @param inst   实例
     * @param params 扩展参数
     * @param reason 删除原因
     * @param <T>    事件类型
     * @param <I>    实例对象
     */
    <T, I> void triggerDeleteBeforeEvent(Class<T> clazz, I inst, JSONObject params, String reason);

    /**
     * 删除后
     *
     * @param clazz  类型
     * @param inst   实例
     * @param params 扩展参数
     * @param reason 删除原因
     * @param <T>    事件类型
     * @param <I>    实例对象
     */
    <T, I> void triggerDeleteAfterEvent(Class<T> clazz, I inst, JSONObject params, String reason);


    <T, I> void triggerCustomEvent(Class<T> clazz, I inst, String methodName, Object... params);

}
